package com.zeng.config;


import com.zeng.pojo.User;
import com.zeng.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;

public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserService userService;
    // 授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //打印一个提示
        System.out.println("执行了授权方法");
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //  给予权限
//        info.addStringPermission("user:add");
        // 获取授权的对象（用户认证） 拿到当前的对象
        Subject subject = SecurityUtils.getSubject();
        // 获取用户
        User currentUser = (User)subject.getPrincipal();
        // 获取当前用户的权限
        info.addStringPermission(currentUser.getPerms());
        return info;
    }
    // 认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //打印一个提示
//        System.out.println("执行了认证方法");
//        // 用户名密码(暂时先自定义一个做测试)
//        String name = "root";
//        String password = "123456";
//
//        //通过参数获取登录的控制器中生成的 令牌
//        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
//        //用户名认证
//        if (!token.getUsername().equals(name)){
//            // return null 就表示控制器中抛出的相关异常
//            return null;
//        }
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;

        System.out.println("执行认证");
        // 连接真实是数据库
        User user = userService.queryUserByName(token.getUsername());
        if (user==null){// 是否有这个人
            return null; // 没有这个人的错误（非空指针）
        }
        Subject currentSubject = SecurityUtils.getSubject();
        Session session = currentSubject.getSession();
        session.setAttribute("loginUser",user);

        //密码认证， Shiro 自己做，为了避免和密码的接触
        //最后返回一个 AuthenticationInfo 接口的实现类，这里选择 SimpleAuthenticationInfo
        // 三个参数：获取当前用户的认证 ； 密码 ； 认证名
        return new SimpleAuthenticationInfo(user,user.getPwd(),"");
    }
}
